/* HW-20210915P2 积分配对
avg历史平均分。n对积分（可能有负）。
目标是将积分组成能被avg整除的数对并输出，如不存在可行方案，只输出0。
数对输出时先输出和最大的，多对和相等时先输出数字大的那对。
1 < n*2 < 10^5
-10^9 <= x <= 10^9  加和不超int32范围
1 <= avg <= 10^5
*/
#include <algorithm>
#include <iostream>
#include <map>
#include <set>
#include <vector>
using namespace std;

typedef pair<int, int> pii;

int mod(int x, int m){ // 求x模m的正余数
  int r = x % m;
  return (r < 0 ? r + m : r);
}

bool cmp(const pii &a, const pii &b){
  if((a.first + a.second) > (b.first + b.second)){ // 先输出和最大的
    return true;
  }
  if((a.first + a.second) == (b.first + b.second)){ // 和相同时再输出积分对中数较大的
    if(a.first >= b.first){
      return true;
    }
  }
  return false;
};

int main(){
  int avg, n;
  cin >> avg >> n;
  const int n2 = n * 2;
  vector<int> vx(n2), vc(avg); // vx是输入，vc[r]模avg余r的共有多少个
  vector<map<int, int> > vp(avg); // vp[r][x]模avg余r的数x的个数，map自排序，rbegin就是最大的。
  for(int i = 0; i < n2; ++i){
    cin >> vx[i];
    int r = mod(vx[i], avg);
    ++vc[r]; // 按余数分类统计，模avg余r的数值的个数
    ++vp[r][vx[i]]; // 可能有相同值，所以要记数
  }

  if(vc[0] & 1){
    cout << 0 << endl;
    return 0;
  }

  bool match = true;
  for(int i = 1, j = avg - i; i <= j && match; ++i, --j){ // 检查余数互补的数：例如avg=5，余2和余3的数量应相同。
    if(i == j){ // 例如：avg=4, i=2
      if(vc[i] & 1){ // 数量应是偶数
        match = false;
      }
    }else{ // i < j
      if(vc[i] != vc[j]){ // 余数互补的两组数的个数不同，落单就凑不出整除avg的和。
        match = false;
      }
    }
  }
  if(!match){ // 不匹配
    cout << 0 << endl;
    return 0;
  }

  sort(vx.begin(), vx.end());
  vector<pii> vo;
  for(int i = n2 - 1; i >= 0; --i){ // 排序后从大到小配对
    int x = vx[i], r = mod(x, avg);
    if(vp[r].find(x) == vp[r].end()){ // x用完了（和更大的数配对）
      continue;
    }
    vp[r][x] -= 1; // 立即递减数量
    if(vp[r][x] == 0){ vp[r].erase(x); } // 到0就清理，防止同余的自身误配（如avg=5，x=10）
    // x是可用的最大数，因此x > y
    int m = (r == 0 ? 0 : avg - r); // 互补的余数
    int y = vp[m].rbegin()->first; // K:y -> V:cnt
    vp[m][y] -= 1;
    if(vp[m][y] == 0){ vp[m].erase(y); }
    vo.push_back(make_pair(x, y));
  }

  sort(vo.begin(), vo.end(), cmp); // 之前只能保证同余类优先选大数配对，还要按和排序。
  for(int i = 0; i < n; ++i){
    cout << vo[i].first << ' ' << vo[i].second << (i < n-1 ? ' ' : '\n'); // 防止行尾多余空格
  }
  cout << flush;
}